﻿//using System.Collections;
//using System.Collections.Generic;
//using UnityEngine;
//using System;

///// <summary>
///// 这个类会造成性能下降，应该动态启用和关闭。
///// CusSkinMeshRdr也是不需要每帧（静止帧）都更新法线和位置
///// TODO：
///// （暂缓）投射时轨迹匹配复合曲线，曲线拟合有点没学会。先需要学微积分偏导数。
///// （暂缓）修复平坦子层级后的骨骼绘制
///// （完成）通过使用Slope值，使投射时头发的“上向”（现在是Forward）朝向摄像机。
///// （完成）分段曲线（复合贝塞尔曲线）
///// （完成）支持自带的SMR，对比性能
///// （进行中）随时调整头发模型，将调整类改为工具类
///// （进行中）Gizmos操纵杆
///// （完成）曲线顶点绘制
///// </summary>
//[Serializable]
//public partial class CurveData : Data
//{
//    float Length()
//    {
//        float len = 0;
//        foreach (var curve in bezierCurves)
//        {
//            len += curve.Length;
//        }
//        return len;
//    }
//    Vector3 Evaluate(float t)
//    {
//        var index = 0;
//        foreach (var et in listEndTime)
//        {
//            if (t < et)
//            {
//                goto findIndex;
//            }
//            index++;
//        }
//        index--;
//        findIndex:
//        return bezierCurves[index].Evaluate(t - listStartTime[index]);
//    }
//    float Slope(float t)
//    {
//        var index = 0;
//        foreach (var et in listEndTime)
//        {
//            if (t > et)
//            {
//                goto findIndex;
//            }
//            index++;
//        }
//        index--;
//        findIndex:
//        return bezierCurves[index].Slope(t - listStartTime[index]);
//    }
//    void InitEndTimes()
//    {
//        var lenTotal = Length();
//        float lenCurrent = 0;
//        listEndTime = new List<float>();
//        listStartTime = new List<float>();
//        foreach (var curve in bezierCurves)
//        {
//            listStartTime.Add(lenCurrent);
//            lenCurrent += curve.Length;
//            listEndTime.Add(lenCurrent / lenTotal);
//        }
//    }
//    public void Init(bool clearCurves = true)
//    {
//        if (clearCurves) bezierCurves = new List<BezierCurve>();
//        rig = bones[0].parent;
//        for (int i = 0; i < bones.Length; i++)
//        {
//            bonesLength.Add(bones[i].GetChild(0).localPosition.magnitude);
//        }
//        foreach (var bone in bones)
//        {
//            bone.parent = rig;
//        }
//    }
//    public void SnapBonesToCurve()
//    {
//        if (bones == null) return;
//        if (bezierCurves == null || bezierCurves.Count == 0) return;
//        bones[0].position = bezierCurves[0].points[0];
//        if (bones.Length < 2) return;
//        Vector3 targetPos;
//        InitEndTimes();
//        float t = 0f;
//        for (int i = 0; i < bones.Length; i++)
//        {
//            var bone = bones[i];
//            if (i > 0)
//            {
//                var parent = bones[i - 1];
//                bone.position = parent.position + parent.up * bonesLength[i - 1];
//            }
//            while (true)
//            {
//                t += step;
//                targetPos = Evaluate(t);
//                var dist = Vector3.Distance(bones[i].position, targetPos);
//                //if (dist > bones[i + 1].localPosition.magnitude) break;
//                if (dist > bonesLength[i]) break;
//                if (t > 1f) goto syncPair;
//            }

//            Snap(bone, targetPos - bone.position);

//            /// twist
//            var q = Quaternion.AngleAxis(Slope(t), bone.up);
//            bone.rotation = q * bone.rotation;
//        }
//        syncPair:
//        if (Selector.current == mono.transform)
//        {
//            string pairName = "";
//            if (mono.name.EndWithIC(".r")) pairName = mono.name.ReplaceEnd(".r", ".l");
//            if (mono.name.EndWithIC(".l")) pairName = mono.name.ReplaceEnd(".l", ".r");
//            var pairT = mono.transform.parent.Search(pairName);
//            if (pairT != null)
//            {
//                pair = pairT.GetComponent<Hair>();
//                pair.curveData.pair = mono.GetComponent<Hair>();
//                var curve = bezierCurves.GetEnumerator();
//                foreach (var curveM in pair.curveData.bezierCurves)
//                {
//                    curve.MoveNext();
//                    var c = curve.Current;
//                    curveM.points[0] = c.points[0].MirrorX();
//                    curveM.points[1] = c.points[1].MirrorX();
//                    curveM.points[2] = c.points[2].MirrorX();
//                    curveM.points[3] = c.points[3].MirrorX();
//                    curveM.slope1 = -c.slope1;
//                    curveM.slope2 = -c.slope2;
//                }
//            }
//        }
//    }
//}
